//
// Created by Administrator on 25-1-20.
//
///
///!一个简单的三角形
///
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include "tools/structs/shader_program.h"
#include "tools/ShaderLoader.cpp"
#include <glm/gtc/matrix_transform.hpp>
#include <iostream>
#include "glm/gtc/type_ptr.hpp"

enum VAO_IDs {Triangles,NumVAOs};
enum Buffer_IDs {ArrayBuffer, NumBuffers};
enum Attrib_IDs {vPosition = 0};
GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];
constexpr GLuint NumVertices = 6;
using namespace std;
/**
 * 三角形模型
 */
float* triangle() {
    // 设置顶点数据（这里我们只绘制一个彩色的三角形）
    auto *vertices = new float [18]{
        0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 顶部顶点，红色
        -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 左下角顶点，绿色
        0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 右下角顶点，蓝色
    };
    return vertices;
}
//
// /**
//  * 执行渲染
//  * @param window    窗口
//  * @param shader_index 着色器索引
//  * @param model     模型
//  * @param model_mat 模型矩阵
//  * @param projection 投影矩阵
//  * @param view      视图矩阵
//  */
// void rendering(GLFWwindow* window, unsigned int shader_index, const float* model, float* model_mat,
//     const float* projection, float* view) {
//     //把模型顶点坐标装入缓冲区
//     unsigned int VBO, VAO;
//     glGenVertexArrays(1, &VAO);
//     glGenBuffers(1, &VBO);
//     glBindVertexArray(VAO);
//     glBindBuffer(GL_ARRAY_BUFFER, VBO);
//     glBufferData(GL_ARRAY_BUFFER, sizeof(model), model, GL_STATIC_DRAW);
//     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), static_cast<void *>(nullptr));
//     glEnableVertexAttribArray(0);
//     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), reinterpret_cast<void *>(3 * sizeof(float)));
//     glEnableVertexAttribArray(1);
//
//     // 设置投影矩阵
//     glm::mat4 projection_mat4 = glm::perspective(glm::radians(projection[0]), projection[1] / projection[2], projection[3], projection[4]);
//     while (!glfwWindowShouldClose(window)) {
//         glClear(GL_COLOR_BUFFER_BIT);
//         glUseProgram(shader_index);
//
//         // 设置视图矩阵
//         glm::mat4 view_mat4 = glm::lookAt(glm::vec3(view[0], view[1], view[2]),
//             glm::vec3(view[3], view[4], view[5]), glm::vec3(view[6], view[7], view[8]));
//         // 设置模型矩阵
//         auto model_mat4 = glm::mat4(model_mat[0]);
//         model_mat4 = glm::rotate(model_mat4, static_cast<float>(glfwGetTime()), glm::vec3(model_mat[1], model_mat[2], model_mat[3]));
//
//         // 设置着色器uniform变量
//         const unsigned int model_loc = glGetUniformLocation(shader_index, "model");
//         const unsigned int view_loc = glGetUniformLocation(shader_index, "view");
//         const unsigned int projection_loc = glGetUniformLocation(shader_index, "projection");
//
//         glUniformMatrix4fv(model_loc, 1, GL_FALSE, glm::value_ptr(model_mat4));
//         glUniformMatrix4fv(view_loc, 1, GL_FALSE, glm::value_ptr(view_mat4));
//         glUniformMatrix4fv(projection_loc, 1, GL_FALSE, glm::value_ptr(projection_mat4));
//
//         glBindVertexArray(VAO);
//         glDrawArrays(GL_TRIANGLES, 0, 3);
//         glBindVertexArray(0);
//
//         glfwSwapBuffers(window);
//         glfwPollEvents();
//     }
//     // 清理资源
//     glDeleteVertexArrays(1, &VAO);
//     glDeleteBuffers(1, &VBO);
//     glDeleteProgram(shaderProgram);
//
//     // 终止GLFW
//     glfwTerminate();
// }
//
// /**
//  * 着色器引擎
//  */
// unsigned int shader() {
//     const shader_program * shader = ShaderLoader::load_shader("chapter1", "chapter_1");
//     if (shader == nullptr) {
//       cerr << "Error loading shaders" << endl;
//       return -1;
//     }
//     // 编译顶点着色器
//     const unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
//     glShaderSource(vertexShader, 1,reinterpret_cast<const GLchar * const *>(shader->vertex_code.c_str()), nullptr);
//     glCompileShader(vertexShader);
//
//     // 编译片段着色器
//     const unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
//     glShaderSource(fragmentShader, 1, reinterpret_cast<const GLchar * const *>(shader->fragment_code.c_str()), nullptr);
//     glCompileShader(fragmentShader);
//
//     // 链接着色器程序
//     const unsigned int shaderProgram = glCreateProgram();
//     glAttachShader(shaderProgram, vertexShader);
//     glAttachShader(shaderProgram, fragmentShader);
//     glLinkProgram(shaderProgram);
//
//     // 删除着色器
//     glDeleteShader(vertexShader);
//     glDeleteShader(fragmentShader);
//     return shaderProgram;
// }
//
// /**
//  * 初始化
//  */
// GLFWwindow* init() {
//     // 初始化GLFW
//     glfwInit();
//     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
//     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
//     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//
//     // 创建一个窗口对象
//     GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr);
//     if (window == nullptr)
//     {
//      std::cout << "Failed to create GLFW window" << std::endl;
//      glfwTerminate();
//     }
//     glfwMakeContextCurrent(window);
//     return window;
// }
// int main(int argc, char *argv[]) {
//     GLFWwindow * window = init();
//     unsigned int shader_index = shader();
//     float * model = triangle();
//     float * model_mat =  {
//         1.0f,
//         0.0f, 1.0f, 0.0f
//     };
//     rendering(window, shader_index, model, nullptr, nullptr, nullptr);
// }
